package kgame5.kgu.spacial {

/**
 * @author kangkai
 * 旋转管理器，控制坦克合理的从一个角度转到另一个角度
 * ok 这个做的很好了已经,功能正常
 */	
import kgame5.k3d.core.obj3d.spacial.SpacialVO;

public class RotateManager {
	public static const 
		TURNING_DIR_LEFT:int=-1,//人向左转
		TURNING_DIR_RIGHT:int=1,//人向右转
		TURNING_DIR_NULL:int=0;//人没有转
	public static var TurningDir:int=0;
	
	//**************转到目标*****************
	//旋转到上下左右4个目标方向，0，90，180，270,currentRotation,aimRotation,speed
	public static function RotateToAim(vo:SpacialVO,aimRotation:int,rotateAngleSpeed:int):Boolean{
		
		vo.v3d_r.y=RotateTo4Dir(vo.v3d_r.y,aimRotation,rotateAngleSpeed);
		
		if(vo.v3d_r.y==aimRotation){//转到目标了
			vo.v3d_r.y=aimRotation;
			return true;
		}
		
		return false;
		
	}
	///////////////
	//旋转到上下左右4个目标方向，0，90，180，270,currentRotation,aimRotation,speed
	private static function RotateTo4Dir(cr:Number,ar:Number,sp:Number):Number{
		
		TurningDir=TURNING_DIR_NULL;//默认是无转向的
		
		if(cr>=360){
			cr-=360;
		}else if(cr<0){
			cr+=360;
		}
		if(cr==ar){
			return ar;
		}
		//T.p("RotateTo4Dir",cr,ar);
		//
		switch(ar){
			case 0:
			if(cr>=0&&cr<90){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
				if(cr<0){
					return ar;
				}
			}else if(cr>=90&&cr<180){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
			}else if(cr>=180&&cr<270){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
			}else if(cr>=270&&cr<360){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
				if(cr>360){
					return ar;
				}
			}
			break;
			case 90:
			if(cr>=0&&cr<90){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
				if(cr>90){
					return ar;
				}
			}else if(cr>=90&&cr<180){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
				if(cr<90){
					return ar;
				}
			}else if(cr>=180&&cr<270){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
			}else if(cr>=270&&cr<360){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
				if(cr>=360){
					cr-=360;
				}
			}
			break;
			case 180:
			if(cr>=0&&cr<90){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
			}else if(cr>=90&&cr<180){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
				if(cr>180){
					return ar;
				}
			}else if(cr>=180&&cr<270){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
				if(cr<180){
					return ar;
				}
			}else if(cr>=270&&cr<360){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
			}
			break;
			case 270:
			if(cr>=0&&cr<90){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
			}else if(cr>=90&&cr<180){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
			}else if(cr>=180&&cr<270){
				cr+=sp;TurningDir=TURNING_DIR_RIGHT;//fsm.WheelTurnRight(fsm.tankInfo.WalkSpeed);//轮子右转动
				if(cr>270){
					return ar;
				}
			}else if(cr>=270&&cr<360){
				cr-=sp;TurningDir=TURNING_DIR_LEFT;//fsm.WheelTurnLeft(fsm.tankInfo.WalkSpeed);//轮子转动
				if(cr<270){
					return ar;
				}
			}
			break;
		}
		return cr;
	}
}//end of class
}
